import java.util.concurrent.CountDownLatch;

// 基于 CountDownLatch 模拟跑步比赛的过程
// 跑步比赛，8个选手依次就位，哨声响才同时出发；所有选手都通过终点，才能公布成绩
public class Test1 {
    public static void main(String[] args) throws InterruptedException {
        // 构造CountDownLatch实例，初始化8表示有8个任务需要完成
        CountDownLatch latch = new CountDownLatch(8);
        for (int i = 0; i < 8; i++) {
            int id = i;
            Thread t = new Thread(() -> {
                System.out.println("运动员" + id + "开始");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("运动员" + id + "到达终点");
                // "撞线操作"，latch 中保存的计数值 -1
                latch.countDown();
            });
            t.start();
        }
        // 主线程中，如何判定所有运动员都到达终点呢？
        // 通过 await 进行等待. 等待过程中，会把当前线程阻塞. await => all wait 等待所有.
        // 阻塞等待所有任务执行完毕. 相当于计数器为0了
        latch.await();
        System.out.println("比赛结束");
    }
}
